package com.atguigu.crowd.mvc.handler;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.atguigu.crowd.constant.CrowdConstant;
import com.atguigu.crowd.entity.Admin;
import com.atguigu.crowd.service.api.AdminService;
import com.github.pagehelper.PageInfo;

@Controller
public class AdminHandler {
    
    @Autowired
    private AdminService adminService;
    
    @RequestMapping("/admin/update.html")
    public String update(
            Admin admin, 
            @RequestParam("pageNum") Integer pageNum, 
            @RequestParam("keyword") String keyword 
            ) throws Exception {
        adminService.update(admin);
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }
    
    
    @RequestMapping("/admin/to/edit/page.html")
    public String toEditPage(
            @RequestParam("adminId") Integer adminId,
            ModelMap modelMap
            ) {
        // 1.根据adminId查询Admin对象
        Admin admin = adminService.getAdminById(adminId);
        // 2.将Admin对象存入模型
        modelMap.addAttribute("admin", admin);
        
        return "admin-edit";
    }
    
    @PreAuthorize("hasAuthority('user:save')")
    @RequestMapping("/admin/save.html")
    public String save(Admin admin) throws Exception {
        adminService.saveAdmin(admin);
        return "redirect:/admin/get/page.html?pageNum="+Integer.MAX_VALUE;
    }
    
    @RequestMapping("/admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String remove(@PathVariable("adminId") Integer adminId,
                         @PathVariable("pageNum") Integer pageNum,
                         @PathVariable("keyword") String keyword) {
        
        // 执行删除
        adminService.remove(adminId);
        
        // 页面跳转：返回到分页界面
        
        // 尝试方式一 直接转发打admin-page.jsp界面会无法显示
        // return "admin-page";
        
        // 尝试方式二 转发到/admin/get/page.html地址,一但刷新页面会重复执行删除操作，浪费性能
        // return "foeword:/admin/get/page.html";
        
        // 尝试方法三重定向
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }
    
    @RequestMapping("/admin/get/page.html")
    public String getAdminPage(
            // 注意：页面上有可能不提供关键词，要进行适配
            // 在@RequestParam注解中设置defaultValue属性为空字符串表示浏览器不提供关键词时，keyword 变量赋值为空字符串
            @RequestParam(value = "keyword", defaultValue = "") String keyword, 
            // 浏览器未提供 pageNum 时，默认前往第一页
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, 
            // 浏览器未提供 pageSize 时，默认每页显示 5 条记录
            @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize, 
            ModelMap modelMap) {
        // 查询得到分页数据
        PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);
        // 将分页数据存入模型
        modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
        return "admin-page";
    }
    
    
    @RequestMapping("/admin/do/logout.html")
    public String doLogout(HttpSession session) {
        // 强制Session失效
        session.invalidate();
        // 请求重定向
        return "redirect:/admin/to/login/page.html";
    }
    
    @RequestMapping("/admin/do/login.html")
    public String doLogin(
            @RequestParam("loginAcct") String loginAcct,
            @RequestParam("userPswd") String userPswd,
            HttpSession session
            ) {
        // 调用Service方法执行登录检查
        // 这个方法返回admin对象说明登录成功，如果账号、密码不正确则会抛出异常
        Admin admin = adminService.getAdminLoginAcct(loginAcct, userPswd);
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);
        // 请求重定向，避免刷新界面的时候一次次查询数据库
        return "redirect:/admin/to/main/page.html";
    }

}
